package com.xique.system.service.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

import com.xique.common.core.constant.AdvertStatus;
import com.xique.common.core.enums.StatusCode;
import com.xique.common.core.text.Convert;
import com.xique.common.core.utils.DateUtils;
import com.xique.common.core.utils.SecurityUtils;
import com.xique.common.core.web.domain.AjaxResult;
import com.xique.common.datascope.annotation.NeedSetFieldValue;
import com.xique.system.bean.domain.LoginPage;
import com.xique.system.mapper.LoginPageMapper;
import com.xique.system.service.service.ILoginPageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


/**
 * 登录页Service业务层处理
 *
 * @author caogq
 * @date 2022-03-09
 */
@Service
public class LoginPageServiceImpl implements ILoginPageService {
    @Autowired
    private LoginPageMapper loginPageMapper;

    /**
     * 查询登录页
     *
     * @param id 登录页ID
     * @return 登录页
     */
    @Override
    public LoginPage selectLoginPageById(Long id) {
        return loginPageMapper.selectLoginPageById(id);
    }

    /**
     * 查询登录页列表
     *
     * @param loginPage 登录页
     * @return 登录页
     */
    @Override
    public List<LoginPage> selectLoginPageList(LoginPage loginPage) {
        return loginPageMapper.selectLoginPageList(loginPage);
    }

    /**
     * 新增登录页
     *
     * @param loginPage 登录页
     * @return 结果
     */
    @Override
    public int insertLoginPage(LoginPage loginPage) {
        loginPage.setCreateBy(String.valueOf(SecurityUtils.getUserId()));
        loginPage.setCreateTime(DateUtils.getNowDate());
        return loginPageMapper.insertLoginPage(loginPage);
    }

    /**
     * 修改登录页
     *
     * @param loginPage 登录页
     * @return 结果
     */
    @Override
    public int updateLoginPage(LoginPage loginPage) {
        loginPage.setUpdateBy(String.valueOf(SecurityUtils.getUserId()));
        loginPage.setUpdateTime(DateUtils.getNowDate());
        return loginPageMapper.updateLoginPage(loginPage);
    }

    /**
     * 删除登录页对象
     *
     * @param ids 需要删除的数据ID
     * @return 结果
     */
    @Override
    public int deleteLoginPageByIds(String ids) {
        return loginPageMapper.deleteLoginPageByIds(Convert.toStrArray(ids));
    }

    /**
     * 删除登录页信息
     *
     * @param id 登录页ID
     * @return 结果
     */
    @Override
    public int deleteLoginPageById(Long id) {
        return loginPageMapper.deleteLoginPageById(id);
    }

    @Override
    public List<LoginPage> selectCurrentList(LoginPage loginPage) {
        return loginPageMapper.selectCurrentList(loginPage);
    }

    /**
     * @description: 自动上下架
     * @author caogq
     * @date: 2022/3/10 11:05
     * @Param
     */
    @Override
    public AjaxResult autoOnOffLoginPage() {
        LoginPage search = new LoginPage();
        List<LoginPage> loginPages = loginPageMapper.selectLoginPageList(search);
        //查询未上架的页面，统计是否已到达已上架时间
        List<LoginPage> unStartPages = loginPages.stream().filter(e -> e.getStatus().equals("1")).collect(Collectors.toList());
        //查询已上架的页面，统计是否已到达下架时间
        List<LoginPage> inPages = loginPages.stream().filter(e -> e.getStatus().equals("2")).collect(Collectors.toList());
        List<LoginPage> needUpdatePages = new ArrayList<>();
        for (LoginPage unStartPage : unStartPages) {
            if (unStartPage.getStartTime().after(DateUtils.getNowDate())) {
                unStartPage.setStatus("2");
                needUpdatePages.add(unStartPage);
            }
        }
        for (LoginPage inPage : inPages) {
            if (inPage.getEndTime().after(DateUtils.getNowDate())) {
                inPage.setStatus("3");
                needUpdatePages.add(inPage);
            }
        }
        int i = loginPageMapper.batchUpdateLoginPage(needUpdatePages);
        return i > 0 ? AjaxResult.success() : AjaxResult.error();
    }

    @Override
    public String selectLoginPageStatus(Date startTime, Date endTime) {
        //默认未开始
        String status = AdvertStatus.UNSTART;
        //展示中：开始时间 < 当前时间 < 结束时间
        if (startTime.before(DateUtils.getNowDate()) && endTime.after(DateUtils.getNowDate())) {
            status = AdvertStatus.IN;
        }
        //已结束：当前时间>结束时间
        if (endTime.before(DateUtils.getNowDate())) {
            status = AdvertStatus.END;
        }
        return status;
    }
}
